package runtime;

/**
 * Created by zhj on 15-11-12.
 * /A 对于垂直伸缩
 *     一 支持高访问量
 //    希望能够通过升级硬件来达到服务能力的线性增长，此时要求应用必须更具硬件配置来做相应的调整表现在
 //    1 增加cpu
            1.1 如果锁竞争激烈 增加cpu无法提设给你响应速度，同时也无法开启更多的线程来支持高访问量
            1.2 启用固定线程池 无法充分利用cpu  需要更具cpu数来计算一个合理的线程数 gc线程就是这么干的
            1.3 单线程任务不会因为增减cpu而提升速度，可以将该任务进行拆分，让多个线程并行执行， 参考jdk7 Fork/Join
       2 增加内存
            2.1 cach大小固定，增加大小，无法增加cache数据，  合理方法是根据内存计算比例来控制cach大小
            2.2 jvm堆固定  增加内存后，要相应调整jvm堆内存大小，如果超过2g，需要用64位系统，堆变大后，gc可能成为cpu瓶颈
        二 支撑大数据
        数据量变大后会造成 读写速度下降  此时可采取分表方式，分表策略(按主键id,时间等方式)依业务而定
        分表方式 需要应用做配合，首先需先根据分表规则计算出要查询的表，然后在组装相应的sql，但会带来跨表的问题
 B 对于水平伸缩
    一 支持高访问量
        1 软件方面首先要解决系统能否水平伸缩(比如一些有状态的系统)
            对于水平伸缩而言，最佳情况是应用是无状态的，通常是将状态迁移到缓存或db中，db一般为集中存储，所以重点在缓存中的状态如何支持水平伸缩
        缓存信息同步，对于java，主要有
         a 广播同步:基于multicast，用户登录节点A，认证后,将登录信息广播给节点B,C,
            广播开源软件JGroups（tomcat httpSession同步基于jgroups），这是进程内缓存
        b 分布缓存  专门机器来做缓存
            用户登录通过后，将状态信息分布式缓存集群的某台机器,
            为了增加和查找都能定位到相同的缓存节点，通常做法是对key进行hash取模,但缓存节点增删时，会有大量缓存失效
            为了解决缓存失效，采用一致性hash,
                首先对缓存节点hash,落在0/2^32园环上,然后对要存取的key进行hash落到园环上，然后顺时针找第一台节点，
                    当增加节点,只有该增加节点逆时针方向的一小段key失效，这一小段key将新增节点作为存取节点




 */
public class TestRuntime {
    public static void main(String[] args) {
        int coreSize=Runtime.getRuntime().availableProcessors();
        System.out.println(String.format("cpu 核数:%d",coreSize));
    }
}
